package frame.spring.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.lang.reflect.Field;

/**
 * bean的生命周期
 *
 * 解析类得到 BeanDefinition
 * 如果有多个构造方法，要推断构造方法
 * 确认好构造方法，进行实例化得到一个对象
 * 对象中加了@Autowire注解的属性进行熟悉的填充
 * 回调Aware方法-》
 * 调用BeanPostProcessor的初始化前的方法
 * 调用初始化方法
 * 调用BeanPostProcessor的初始化后的方法，在这里进行AOP
 * 如果当前创建的Bean是单例的，则会把Bean放入单例池
 * 使用Bean
 * Spring容器关闭时，调用DisposableBean中的destory()方法
 *
 * Author: shen qi han
 * Date: 2022/3/23 上午11:24
 */
public class BeanMain {

    public static void main(String[] args) {
        // 启动 spring容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

        // mark ！！！
        // xxx类 -》无参构造方法 -》普通对象 -》依赖注入（属性填充） -》Bean
        UserBean userBean = applicationContext.getBean("userBean", UserBean.class);

        // 如何实现 依赖注入
        // 获取该类的 成员变量
        for(Field field : userBean.getClass().getFields()){
            // 找到有 依赖注入的变量
            if(field.isAnnotationPresent(Autowired.class)){
                // 初始化前 （@PostConstruct） -》初始化（InitializingBean） -》初始化后（AOP）-》代理对象 -》Bean


            }
        }

    }

}
